package com.ruoyi.common.core.api;

import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.api.version.ApiVersion;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.utils.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.util.List;

/**
 * api公共类,抽象api公用工具方法
 */
@Slf4j
public abstract class BaseApi extends BaseController implements Serializable {

    /**
     * 转换"数据库实体类"分页为"vo类"分页
     *
     * @param list   数据库实体类列表
     * @param vClass vo类类型
     * @param <P>    实体类泛型
     * @param <V>    vo类泛型
     * @return ApiResult<PageInfo < V>> vo类分页返回结果
     */
    public static <P, V> ApiResult<PageInfo<V>> buildListApiResult(List<P> list, Class<V> vClass) {
        return PageUtil.buildApiResultPage(list, vClass);
    }

    /**
     * 获取版本号
     * @param apiClass 类
     * @return 版本号
     */
    public static String getApiVersion(Class apiClass) {
        Annotation annotation = apiClass.getAnnotation(ApiVersion.class);
        if (annotation != null) {
            return ((ApiVersion) annotation).value();
        }
        return null;
    }

    /**
     * 转换类为另外的类,并复制类的属性.
     *
     * @param po     待转化的类
     * @param tClass 转换目标类的类型
     * @param <P>    待转换类泛型
     * @param <T>    转换目标类泛型
     * @return 转换的目标类
     */
    public <P, T> T buildCopyClass(P po, Class<T> tClass) {
        try {
            T t = tClass.newInstance();
            BeanUtils.copyProperties(po, t);
            return t;
        } catch (InstantiationException | IllegalAccessException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

    /**
     * 转换数据库类型为vo类型,并返回apiResult结果
     *
     * @param id     数据库实体的id
     * @param entity 数据库实体
     * @param vClass vo类的类型
     * @param <P>    数据库类的泛型
     * @param <V>    vo类的泛型
     * @return ApiResult<V> 数据库转vo类结果
     */
    public <P, V> ApiResult<V> buildGetApiResult(Long id, P entity, Class<V> vClass) {
        if (null == entity) {
            return new ApiResult<V>(this.getApiVersion()).setCode(-1).setMsg("您所查询的id{" + id + "}不存在!").setData(null);
        }
        try {
            V vo = vClass.newInstance();
            BeanUtils.copyProperties(entity, vo);
            return new ApiResult<V>().setData(vo).setCode(0);
        } catch (InstantiationException | IllegalAccessException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

    /**
     * 获取版本号
     * @return 版本号
     */
    protected String getApiVersion() {
        Annotation annotation = this.getClass().getAnnotation(ApiVersion.class);
        if (annotation != null) {
            return ((ApiVersion) annotation).value();
        }
        return null;
    }

}
